/**
 * This file is part of Opintopaivakirja.
 *
 * Opintopaivakirja is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Opintopaivakirja is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Opintopaivakirja.  If not, see <http://www.gnu.org/licenses/>.
 */
package opintopaivakirja;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * Luokka toteuttaa järjestelmään hakupalvelun mahdollistavat ominaisuudet.
 *
 * @author Teemu Jonkkari
 * @version 1.0
 */
public class Haku {

    /**
     * Metodilla voidaan suorittaa hakuja tietokannassa olevista projektien muistiinpanoista.
     *
     * @param hakusanat String[]-taulukko, jossa haettavat sanat.
     * @param tagit String[]-taulukko, jossa haettavat tagit.
     * @param valmiit Haetaanko myös valmiiksi merkityistä projekteista.
     * @param poistetut Haetaanko myös poistetuiksi merkityistä projekteista.
     * @return ArrayList, jossa projekteihin sisältyvät muistiinpanot, joista löydettiin haettu/haetut merkkijonot.
     */
    public ArrayList<Projekti> selectHaku(String[] hakusanat, String[] tagit,
            boolean valmiit, boolean poistetut) {
        Connection conn = null;
        ResultSet rs = null;
        PreparedStatement ps = null;

        ArrayList<Projekti> hakutulos = new ArrayList<Projekti>();

        String alku = "" +
                "SELECT DISTINCT P.NIMI AS PROJEKTI, P.ID AS PID, " +
                "M.ID AS MID, M.OTSIKKO, M.ASIA, M.TYYPPI " +
                "FROM MUISTIINPANO M JOIN TAGI T ON M.ID = T.MUISTIINPANO_ID " +
                "JOIN PROJEKTI_HAS_MUISTIINPANO PM ON M.ID = PM.MUISTIINPANO_ID " +
                "JOIN PROJEKTI P ON PM.PROJEKTI_ID = P.ID WHERE";

        String like = "";
        int i = 0;

        if (hakusanat.length > 0 && !hakusanat[0].equals("")) { // jos on hakusanoja
            for (String mj : hakusanat) {
                if (i == 0) {
                    like += " ( M.OTSIKKO LIKE '%" + mj + "%' OR M.ASIA LIKE '%" + mj + "%' ) ";
                    i++;
                } else {
                    like += " AND ( M.OTSIKKO LIKE '%" + mj + "%' OR M.ASIA LIKE '%" + mj + "%' ) ";
                }
            }
        }

        int j = 0;
        String tlike = "";

        if (tagit.length > 0 && !tagit[0].equals("")) { // jos on tagejä
            if (i > 0) { // jos on hakusanoja
                tlike += " AND (";
            } else if (tagit.length > 1) { // jos enemmän kuin 1 tägi
                tlike += " (";
            }

            for (String mj : tagit) { // käydään tägit läpi
                if (j == 0) { // 1.
                    tlike += " T.SANA LIKE '" + mj + "' ";
                    j++;
                } else { // loput
                    tlike += "OR T.SANA LIKE '" + mj + "' ";
                }
            }

            if (i > 0) { // jos on hakusanoja
                tlike += ") ";
            } else if (tagit.length > 1) { // jos enemmän kuin 1 tägi
                tlike += ") ";
            }
        }

        // projektin asema (kesken , valmis, poistettu)
        String asema = "AND ( P.ASEMA = 0 ";
        if (valmiit) {
            asema += "OR P.ASEMA = 1 ";
        }

        if (poistetut) {
            asema += "OR P.ASEMA = 2 ";
        }
        asema += ")";

        String loppu = " ORDER BY M.TYYPPI, M.OTSIKKO DESC";

        String hakulause = alku + like + tlike + asema + loppu;

        // System.out.println(hakulause);

        try {
            conn = new Tietokanta().getYhteys();

            ps = conn.prepareStatement(hakulause);

            rs = ps.executeQuery();

            while (rs.next()) {
                Projekti p = new Projekti();
                p.setNimi(rs.getString("projekti"));
                p.setId(rs.getInt("pid"));

                Muistiinpano m = new Muistiinpano();
                m.setId(rs.getInt("mid"));
                m.setOtsikko(rs.getString("otsikko"));
                m.setAsia(rs.getString("asia"));
                m.setTyyppi(rs.getInt("tyyppi"));

                p.setMuistiinpano(m);

                hakutulos.add(p);
            }

        } catch (SQLException ex) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
        } catch (NullPointerException e) {
            Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), e);
        } finally {
            if (ps != null) {
                try {
                    ps.close();
                    ps = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }

            if (rs != null) {
                try {
                    rs.close();
                    rs = null;
                } catch (SQLException ex) {
                    Virheenkasittely.getInstance().setVirhe(Tietokanta.class.getName(), ex);
                }
            }
            return hakutulos;
        }
    }
}
